package com.zzyl.service.impl;

import com.zzyl.dto.BedDto;
import com.zzyl.entity.Bed;
import com.zzyl.mapper.BedMapper;
import com.zzyl.service.BedService;
import com.zzyl.vo.BedVo;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

@Service
public class BedServiceImpl implements BedService {


    private final BedMapper bedMapper;

    /**
     * 构造器注入
     */
    public BedServiceImpl(BedMapper bedMapper) {
        this.bedMapper = bedMapper;
    }

    /**
     * 删除床位
     * 若该床位绑定老人则不可删除,两种方法
     * 1.可以根据床位状态判断
     * 2.可以根据老人表查看是否与床位id绑定
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteBedByBedId(Long id) {
        int row = 0;
        //参数校验
        if (Objects.isNull(id)){
            return row;
        }

        //业务处理
        //判断床位是否存在
        if (Objects.isNull(bedMapper.selectBedByBedId(id))){
            return row;
        }

        //该床位是否空闲---床位状态为0则空闲，1已入住
        if ((bedMapper.selectBedStatusByBedId(id)!=0)){
            return row;
        }

        //删除床位
        row = bedMapper.deleteBedByBedId(id);

        return row;
    }

//    /**
//     * 修改床位
//     */
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public int updateBed(BedDto dto) {
//
//        int row = 0;
//        //参数校验---床位号不能为空,id和房间id不能为空
//        if (ObjectUtils.isEmpty(dto.getBedNumber()) || Objects.isNull(dto.getId()) || Objects.isNull(dto.getRoomId())){
//            return row;
//        }
//
//        //业务处理
//        //根据床位id删除床位---需判断是否空闲
//        if (bedMapper.selectBedStatusByBedId(dto.getId())==1){
//            return row;
//        }
//        //删除床位
//        bedMapper.deleteBedByBedId(dto.getId());
//        //封装数据
//        //创建床位
//        Bed bed = new Bed();
//        BeanUtils.copyProperties(dto,bed);
//        //数据完善
//        bed.setUpdateBy(1L);
//        bed.setUpdateTime(LocalDateTime.now());
//        bed.setBedStatus(0);
//        //重新添加床位
//        row = bedMapper.insertBed(bed);
//
//        //返回结果
//        return row;
//    }

    /**
     * 修改床位
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateBed(BedDto dto) {

        int row = 0;
        //参数校验---床位号不能为空,排序不能为空
        if (ObjectUtils.isEmpty(dto.getBedNumber()) || Objects.isNull(dto.getSort())){
            return row;
        }

        //床位号不能重复---但如果在修改过程中只修改排序,那么就不用校验了

        //创建床位
        Bed bed = new Bed();
        BeanUtils.copyProperties(dto,bed);
        //数据完善
        bed.setUpdateBy(1L);
        bed.setUpdateTime(LocalDateTime.now());
        bed.setBedStatus(0);

        //修改床位
        row = bedMapper.updateBedByBedId(bed);
        //返回结果
        return row;
    }

    /**
     * 根据床位ID查询床位
     */
    @Override
    public BedDto readBedById(Long id) {
        //参数校验
        if (Objects.isNull(id)){
            return null;
        }
        //业务处理
        Bed bed = bedMapper.selectBedByBedId(id);
        if (!Objects.nonNull(bed)){
           return null;
        }

        //封装数据
        BedDto bedDto = new BedDto();
        BeanUtils.copyProperties(bed,bedDto);
        return bedDto;
    }

    /**
     * 创建床位
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int createBed(BedDto dto) {

        int row = 0;
        //参数校验--床位号和序号必填且不同--对应房间号
        if (ObjectUtils.isEmpty(dto.getBedNumber()) || Objects.isNull(dto.getSort()) || Objects.isNull(dto.getRoomId())){
            return row;
        }
        //业务处理
        //是否存在床位
        if (Objects.nonNull(bedMapper.selectBedByBedNumber(dto.getBedNumber()))){
            return row;
        }

        //封装数据
        Bed bed = new Bed();
        //数据拷贝
        BeanUtils.copyProperties(dto,bed);
        //数据完善
        bed.setBedStatus(0);
        bed.setCreateBy(1L);
        bed.setUpdateBy(1L);
        bed.setCreateTime(LocalDateTime.now());
        bed.setUpdateTime(LocalDateTime.now());

        //添加床位
        row = bedMapper.insertBed(bed);
        return row;
    }

    @Override
    public List<BedVo> getBedsByRoomId(Long roomId) {
        return bedMapper.getBedsByRoomId(roomId);
    }

}

